// ============================================================================
// 数据服务层 - 统一的数据访问接口
// ============================================================================

import { ipcService } from './ipc-service'
import { WeiboLoginData, ScrapeTask, AppConfig } from '../../shared/types'
import { logger } from '../utils/logger'

/**
 * 数据服务类 - 提供类型安全的数据访问接口
 */
export class DataService {
  private static instance: DataService
  private serviceLogger = logger
  private constructor() {}

  /**
   * 获取单例实例
   */
  static getInstance(): DataService {
    if (!DataService.instance) {
      DataService.instance = new DataService()
    }
    return DataService.instance
  }

  // ============================================================================
  // 账号相关操作
  // ============================================================================

  /**
   * 获取账号列表
   */
  async getAccounts(): Promise<WeiboLoginData[]> {
    try {
      const accounts = await ipcService.invoke<WeiboLoginData[]>('login:get-accounts')
      this.serviceLogger.debug('获取账号列表成功', { count: accounts?.length || 0 })
      return accounts || []
    } catch (error) {
      this.serviceLogger.error('获取账号列表失败', error)
      throw error
    }
  }

  /**
   * 开始登录
   */
  async startLogin(): Promise<WeiboLoginData> {
    try {
      const loginData = await ipcService.invoke<WeiboLoginData>('login:start')
      this.serviceLogger.info('登录成功', { userId: loginData.userInfo.id })
      return loginData
    } catch (error) {
      this.serviceLogger.error('登录失败', error)
      throw error
    }
  }

  /**
   * 验证账号会话
   */
  async validateAccount(accountId: string): Promise<boolean> {
    try {
      const isValid = await ipcService.invoke<boolean>('login:validate', accountId)
      this.serviceLogger.debug('账号验证完成', { accountId, isValid })
      return isValid
    } catch (error) {
      this.serviceLogger.error('账号验证失败', error)
      throw error
    }
  }

  /**
   * 删除账号
   */
  async deleteAccount(accountId: string): Promise<boolean> {
    try {
      const success = await ipcService.invoke<boolean>('login:delete-account', accountId)
      this.serviceLogger.info('删除账号', { accountId, success })
      // 清理相关缓存
      ipcService.clearCache('login:get-accounts')
      return success
    } catch (error) {
      this.serviceLogger.error('删除账号失败', error)
      throw error
    }
  }

  /**
   * 删除无效账号
   */
  async deleteInvalidAccounts(): Promise<number> {
    try {
      const deletedCount = await ipcService.invoke<number>('login:delete-invalid-accounts')
      this.serviceLogger.info('删除无效账号', { deletedCount })
      // 清理相关缓存
      ipcService.clearCache('login:get-accounts')
      return deletedCount
    } catch (error) {
      this.serviceLogger.error('删除无效账号失败', error)
      throw error
    }
  }

  // ============================================================================
  // 任务相关操作
  // ============================================================================

  /**
   * 获取任务列表
   */
  async getTasks(): Promise<ScrapeTask[]> {
    try {
      const tasks = await ipcService.invoke<ScrapeTask[]>('task:get-all')
      this.serviceLogger.debug('获取任务列表成功', { count: tasks?.length || 0 })
      return tasks || []
    } catch (error) {
      this.serviceLogger.error('获取任务列表失败', error)
      throw error
    }
  }

  /**
   * 获取任务详情
   */
  async getTaskById(taskId: string): Promise<ScrapeTask | null> {
    try {
      const task = await ipcService.invoke<ScrapeTask>('task:get-by-id', taskId)
      this.serviceLogger.debug('获取任务详情成功', { taskId })
      return task
    } catch (error) {
      this.serviceLogger.error('获取任务详情失败', error)
      throw error
    }
  }

  /**
   * 创建任务
   */
  async createTask(taskData: Partial<ScrapeTask>): Promise<ScrapeTask> {
    try {
      const task = await ipcService.invoke<ScrapeTask>('task:create', taskData)
      this.serviceLogger.info('创建任务成功', { taskId: task.id })
      // 清理任务列表缓存
      ipcService.clearCache('task:get-all')
      return task
    } catch (error) {
      this.serviceLogger.error('创建任务失败', error)
      throw error
    }
  }

  /**
   * 启动任务
   */
  async startTask(taskId: string): Promise<void> {
    try {
      await ipcService.invoke('task:start', taskId)
      this.serviceLogger.info('启动任务成功', { taskId })
      // 清理相关缓存
      ipcService.clearCache('task:')
    } catch (error) {
      this.serviceLogger.error('启动任务失败', error)
      throw error
    }
  }

  /**
   * 停止任务
   */
  async stopTask(taskId: string): Promise<void> {
    try {
      await ipcService.invoke('task:stop', taskId)
      this.serviceLogger.info('停止任务成功', { taskId })
      // 清理相关缓存
      ipcService.clearCache('task:')
    } catch (error) {
      this.serviceLogger.error('停止任务失败', error)
      throw error
    }
  }

  // ============================================================================
  // 配置相关操作
  // ============================================================================

  /**
   * 获取应用配置
   */
  async getConfig(): Promise<AppConfig | null> {
    try {
      const config = await ipcService.invoke<AppConfig>('config:get')
      this.serviceLogger.debug('获取配置成功')
      return config
    } catch (error) {
      this.serviceLogger.error('获取配置失败', error)
      throw error
    }
  }

  /**
   * 更新配置
   */
  async updateConfig(configUpdate: Partial<AppConfig>): Promise<void> {
    try {
      await ipcService.invoke('config:update', configUpdate)
      this.serviceLogger.info('更新配置成功')
      // 清理配置缓存
      ipcService.clearCache('config:get')
    } catch (error) {
      this.serviceLogger.error('更新配置失败', error)
      throw error
    }
  }

  // ============================================================================
  // 数据统计操作
  // ============================================================================

  /**
   * 获取统计信息
   */
  async getStats(): Promise<any> {
    try {
      const stats = await ipcService.invoke('data:get-stats')
      this.serviceLogger.debug('获取统计信息成功')
      return stats
    } catch (error) {
      this.serviceLogger.error('获取统计信息失败', error)
      throw error
    }
  }

  // ============================================================================
  // 微博数据操作
  // ============================================================================

  /**
   * 获取微博数据统计信息
   */
  async getWeiboDataStats(): Promise<{
    total: number
    today: number
    thisWeek: number
    thisMonth: number
    totalUsers: number
    totalTasks: number
    avgInteractions: number
    topKeywords: Array<{ keyword: string; count: number }>
  }> {
    try {
      const stats = await ipcService.invoke('data:get-weibo-stats')
      this.serviceLogger.debug('获取微博数据统计成功')
      return stats
    } catch (error) {
      this.serviceLogger.error('获取微博数据统计失败', error)
      throw error
    }
  }

  /**
   * 获取微博数据列表
   */
  async getWeiboDataList(params: {
    page: number
    pageSize: number
    keyword?: string
    filterType?: 'all' | 'original' | 'repost'
    sortBy?: 'createdAt' | 'publishedAt' | 'interactions'
    sortOrder?: 'asc' | 'desc'
  }): Promise<{
    data: any[]
    total: number
    page: number
    pageSize: number
  }> {
    try {
      const result = await ipcService.invoke('data:get-weibo-list', params)
      this.serviceLogger.debug('获取微博数据列表成功', {
        page: params.page,
        count: result.data?.length || 0
      })
      return result
    } catch (error) {
      this.serviceLogger.error('获取微博数据列表失败', error)
      throw error
    }
  }

  /**
   * 导出数据
   */
  async exportData(taskId: string, format: string): Promise<string> {
    try {
      const filePath = await ipcService.invoke<string>('data:export', taskId, format)
      this.serviceLogger.info('导出数据成功', { taskId, format, filePath })
      return filePath
    } catch (error) {
      this.serviceLogger.error('导出数据失败', error)
      throw error
    }
  }

  // ============================================================================
  // 用户数据操作
  // ============================================================================

  /**
   * 获取用户数据统计信息
   */
  async getUserDataStats(): Promise<{
    total: number
    today: number
    thisWeek: number
    thisMonth: number
    vipUsers: number
    verifiedUsers: number
    avgFollowers: number
    topUsers: Array<{ nickname: string; followersCount: number }>
  }> {
    try {
      const stats = await ipcService.invoke('data:get-user-stats')
      this.serviceLogger.debug('获取用户数据统计成功')
      return stats
    } catch (error) {
      this.serviceLogger.error('获取用户数据统计失败', error)
      throw error
    }
  }

  /**
   * 获取用户数据列表
   */
  async getUserDataList(params: {
    page: number
    pageSize: number
    keyword?: string
    filterType?: 'all' | 'vip' | 'verified' | 'normal'
    sortBy?: 'createdAt' | 'followersCount' | 'statusesCount'
    sortOrder?: 'asc' | 'desc'
  }): Promise<{
    data: any[]
    total: number
    page: number
    pageSize: number
  }> {
    try {
      const result = await ipcService.invoke('data:get-user-list', params)
      this.serviceLogger.debug('获取用户数据列表成功', {
        page: params.page,
        count: result.data?.length || 0
      })
      return result
    } catch (error) {
      this.serviceLogger.error('获取用户数据列表失败', error)
      throw error
    }
  }

  // ============================================================================
  // 调试方法
  // ============================================================================

  /**
   * 调试用户数据
   */
  async debugUserData(): Promise<void> {
    try {
      await ipcService.invoke('debug:user-data')
      this.serviceLogger.debug('调试用户数据完成')
    } catch (error) {
      this.serviceLogger.error('调试用户数据失败', error)
      throw error
    }
  }

  /**
   * 批量更新用户完整信息
   */
  async updateUsersCompleteInfo(limit: number = 10): Promise<void> {
    try {
      await ipcService.invoke('data:update-users-complete-info', { limit })
      this.serviceLogger.debug('批量更新用户完整信息完成', { limit })
    } catch (error) {
      this.serviceLogger.error('批量更新用户完整信息失败', error)
      throw error
    }
  }
}

/**
 * 全局数据服务实例
 */
export const dataService = DataService.getInstance()
